/**
 * 主应用文件
 * 负责初始化Express应用、连接数据库、设置路由和SSE端点
 */
const express = require('express');
const path = require('path');
const connectDB = require('./config/db');
const messageRoutes = require('./routes/messages');

// 创建Express应用实例
const app = express();

// 连接MongoDB数据库
connectDB();

// 使用JSON解析中间件
app.use(express.json());

// 设置静态文件目录
app.use(express.static(path.join(__dirname, 'public')));

// 挂载消息相关路由
app.use('/api/messages', messageRoutes);

/**
 * SSE(Server-Sent Events)端点
 * 提供实时消息推送功能
 */
app.get('/messages', async (req, res) => {
  // 设置SSE响应头
  res.setHeader('Content-Type', 'text/event-stream');
  res.setHeader('Cache-Control', 'no-cache');
  res.setHeader('Connection', 'keep-alive');

  // 获取初始消息并发送
  const Message = require('./models/message');
  const messages = await Message.find().sort({ timestamp: -1 }).limit(10);
  res.write(`data: ${JSON.stringify(messages)}\n\n`);

  // 记录上次推送的最新消息时间
  let lastTimestamp = messages.length > 0 ? new Date(messages[0].timestamp) : new Date();

  // 设置定时器检查新消息
  const interval = setInterval(async () => {
    // 查找自上次推送后新增的消息
    const newMessages = await Message.find({
      timestamp: { $gt: lastTimestamp }
    }).sort({ timestamp: 1 });
    if (newMessages.length > 0) {
      res.write(`data: ${JSON.stringify(newMessages)}\n\n`);
      // 更新lastTimestamp为最新消息的时间
      lastTimestamp = new Date(newMessages[newMessages.length - 1].timestamp);
    }
  }, 1000);

  // 客户端断开连接时清理资源
  req.on('close', () => {
    clearInterval(interval);
    res.end();
  });
});

module.exports = app;